#pragma once
/** @file body.hpp
 *  @brief Code that handles regressing the whole body using the legacy ( MocapNET 1 ) engine that encoded the whole body at once..
 *  This is no longer used since the body has been split in upper and lower body to more effectively treat occlusions
 *  however the code remains here as documentation and for backwards compatibility  
 *  @author Ammar Qammaz (AmmarkoV)
 */
 
 
#include "../mocapnet2.hpp"


/**
 * @brief An array with string labels for what each element of an input should be after concatenating uncompressed and compressed input.
 * Use ./GroundTruthDumper --from dataset/headerWithHeadAndOneMotion.bvh --printc 
 * to extract this automatically
 */
 /*
enum MOCAPNET_BODY_Output_Joints
{
MOCAPNET_BODY_OUTPUT_HIP_XPOSITION=0,    //0
MOCAPNET_BODY_OUTPUT_HIP_YPOSITION,      //1
MOCAPNET_BODY_OUTPUT_HIP_ZPOSITION,      //2
MOCAPNET_BODY_OUTPUT_HIP_ZROTATION,      //3
MOCAPNET_BODY_OUTPUT_HIP_YROTATION,      //4
MOCAPNET_BODY_OUTPUT_HIP_XROTATION,      //5
MOCAPNET_BODY_OUTPUT_ABDOMEN_ZROTATION,  //6
MOCAPNET_BODY_OUTPUT_ABDOMEN_XROTATION,  //7
MOCAPNET_BODY_OUTPUT_ABDOMEN_YROTATION,  //8
MOCAPNET_BODY_OUTPUT_CHEST_ZROTATION,    //9
MOCAPNET_BODY_OUTPUT_CHEST_XROTATION,    //10
MOCAPNET_BODY_OUTPUT_CHEST_YROTATION,    //11
MOCAPNET_BODY_OUTPUT_NECK_ZROTATION,     //12
MOCAPNET_BODY_OUTPUT_NECK_XROTATION,     //13
MOCAPNET_BODY_OUTPUT_NECK_YROTATION,     //14
MOCAPNET_BODY_OUTPUT_HEAD_ZROTATION,     //15
MOCAPNET_BODY_OUTPUT_HEAD_XROTATION,     //16
MOCAPNET_BODY_OUTPUT_HEAD_YROTATION,     //17
MOCAPNET_BODY_OUTPUT_EYE_L_ZROTATION,    //18
MOCAPNET_BODY_OUTPUT_EYE_L_XROTATION,    //19
MOCAPNET_BODY_OUTPUT_EYE_L_YROTATION,    //20
MOCAPNET_BODY_OUTPUT_EYE_R_ZROTATION,    //21
MOCAPNET_BODY_OUTPUT_EYE_R_XROTATION,    //22
MOCAPNET_BODY_OUTPUT_EYE_R_YROTATION,    //23
MOCAPNET_BODY_OUTPUT_RSHOULDER_ZROTATION,//24
MOCAPNET_BODY_OUTPUT_RSHOULDER_XROTATION,//25
MOCAPNET_BODY_OUTPUT_RSHOULDER_YROTATION,//26
MOCAPNET_BODY_OUTPUT_RELBOW_ZROTATION,   //27
MOCAPNET_BODY_OUTPUT_RELBOW_XROTATION,   //28
MOCAPNET_BODY_OUTPUT_RELBOW_YROTATION,   //29
MOCAPNET_BODY_OUTPUT_RHAND_ZROTATION,    //30
MOCAPNET_BODY_OUTPUT_RHAND_XROTATION,    //31
MOCAPNET_BODY_OUTPUT_RHAND_YROTATION,    //32
MOCAPNET_BODY_OUTPUT_LSHOULDER_ZROTATION,//33
MOCAPNET_BODY_OUTPUT_LSHOULDER_XROTATION,//34
MOCAPNET_BODY_OUTPUT_LSHOULDER_YROTATION,//35
MOCAPNET_BODY_OUTPUT_LELBOW_ZROTATION,//36
MOCAPNET_BODY_OUTPUT_LELBOW_XROTATION,//37
MOCAPNET_BODY_OUTPUT_LELBOW_YROTATION,//38
MOCAPNET_BODY_OUTPUT_LHAND_ZROTATION,//39
MOCAPNET_BODY_OUTPUT_LHAND_XROTATION,//40
MOCAPNET_BODY_OUTPUT_LHAND_YROTATION,//41
MOCAPNET_BODY_OUTPUT_RHIP_ZROTATION,//42
MOCAPNET_BODY_OUTPUT_RHIP_XROTATION,//43
MOCAPNET_BODY_OUTPUT_RHIP_YROTATION,//44
MOCAPNET_BODY_OUTPUT_RKNEE_ZROTATION,//45
MOCAPNET_BODY_OUTPUT_RKNEE_XROTATION,//46
MOCAPNET_BODY_OUTPUT_RKNEE_YROTATION,//47
MOCAPNET_BODY_OUTPUT_RFOOT_ZROTATION,//48
MOCAPNET_BODY_OUTPUT_RFOOT_XROTATION,//49
MOCAPNET_BODY_OUTPUT_RFOOT_YROTATION,//50
MOCAPNET_BODY_OUTPUT_TOE1_2_R_ZROTATION,//51
MOCAPNET_BODY_OUTPUT_TOE1_2_R_XROTATION,//52
MOCAPNET_BODY_OUTPUT_TOE1_2_R_YROTATION,//53
MOCAPNET_BODY_OUTPUT_TOE5_3_R_ZROTATION,//54
MOCAPNET_BODY_OUTPUT_TOE5_3_R_XROTATION,//55
MOCAPNET_BODY_OUTPUT_TOE5_3_R_YROTATION,//56
MOCAPNET_BODY_OUTPUT_LHIP_ZROTATION,//57
MOCAPNET_BODY_OUTPUT_LHIP_XROTATION,//58
MOCAPNET_BODY_OUTPUT_LHIP_YROTATION,//59
MOCAPNET_BODY_OUTPUT_LKNEE_ZROTATION,//60
MOCAPNET_BODY_OUTPUT_LKNEE_XROTATION,//61
MOCAPNET_BODY_OUTPUT_LKNEE_YROTATION,//62
MOCAPNET_BODY_OUTPUT_LFOOT_ZROTATION,//63
MOCAPNET_BODY_OUTPUT_LFOOT_XROTATION,//64
MOCAPNET_BODY_OUTPUT_LFOOT_YROTATION,//65
MOCAPNET_BODY_OUTPUT_TOE1_2_L_ZROTATION,//66
MOCAPNET_BODY_OUTPUT_TOE1_2_L_XROTATION,//67
MOCAPNET_BODY_OUTPUT_TOE1_2_L_YROTATION,//68
MOCAPNET_BODY_OUTPUT_TOE5_3_L_ZROTATION,//69
MOCAPNET_BODY_OUTPUT_TOE5_3_L_XROTATION,//70
MOCAPNET_BODY_OUTPUT_TOE5_3_L_YROTATION,//71
//----------------------------- 
MOCAPNET_BODY_OUTPUT_NUMBER// = 72
};
*/

int mocapnetBody_initializeAssociations(struct MocapNET2 * mnet, struct skeletonSerialized * input);

int mocapnetBody_initialize(struct MocapNET2 * mnet,const char * filename,float qualitySetting,unsigned int mode,unsigned int forceCPU);

int mocapnetBody_unload(struct MocapNET2 * mnet);

int mocapnetBody_fillResultVector(std::vector<float> &finalResultVector,std::vector<float> resultBody);

std::vector<float> mocapnetBody_evaluateInput(struct MocapNET2 * mnet,struct skeletonSerialized * input);